package org.ala.shopping_test.shopping_center.repository.shard_key;

import org.ala.shopping_test.ShardInfos;
import org.ala.tiktools.sharddb.mybatis.router.ShardInfo;
import org.ala.tiktools.sharddb.mybatis.router.shard_key_router.IShardKeyRouter;
import org.ala.tiktools.tools.TimestampTools;
import org.ala.tiktools.tools.kv.KV;
import org.ala.tiktools.tools.kv.Maps;

import java.util.*;

/**
 * 1）根据买家卖家id + 下单时间历史总天数 分库
 * 2）根据时间分表
 *
 * @author ala
 * @date 2025-03-21 12:47
 */
public class ShoppingOrderBuyerSellerShardKeyRouter implements IShardKeyRouter<ShoppingOrderBuyerSellerShardKey> {
	/**
	 * 	买家卖家分库分表逻辑
	 * 	<p>	买家卖家自己的id不能为空
	 * 	<p>	
	 */
    @Override
    public Map<ShardInfo, ShoppingOrderBuyerSellerShardKey> route(ShoppingOrderBuyerSellerShardKey k) {
        //  买家卖家id不能为空
        if (k.getId() != null) {
        	//	如果给定了下单时间，按照下单时间路由具体某一天
            if (k.getTimestamp() != -1) {
                int day = (int)(k.getTimestamp() / TimestampTools.DAY_MS);
                String db = ShardInfos.DB_SHOPPING_CENTER[(int)((k.getId() + day) % ShardInfos.DB_SHOPPING_CENTER.length)];
                String table = TimestampTools.formatYYYYMMDD(k.getTimestamp());
                return Maps.build(KV.build(ShardInfo.build(db, table), k));
            } 
            //	否则按开始结束时间段切成每天（开始结束时间点前面的代码会做非空判断，默认当前时间往前倒7天）
            else {
                List<long[]> days = TimestampTools.cutByDay(k.getTimestampGte(), k.getTimestampLte());
                return Maps.group(days,
                        d -> ShardInfo.build(ShardInfos.DB_SHOPPING_CENTER[(int)((k.getId() + (int)(d[1] / TimestampTools.DAY_MS)) % ShardInfos.DB_SHOPPING_CENTER.length)], TimestampTools.formatYYYYMMDD(d[1])),
                        k::copy,
                        (l, _k) -> _k.timestampGte(l[0]).timestampLte(l[1]));
            }
        }
        return null;
    }
}
